/*
 * 这是一个用poll函数处理来自多个文件描述符的引领。
 * select函数调用对传送给它的文件描述符集进行修改，程序每次调用select函数时必须重置这些描述符集
 * poll函数为输入和返回值使用了独立的变量，因此不必在每次调用poll函数后重置所监控描述符的列表
 *
 * poll函数的优点：不需要在每次调用后重置掩码。
 * 和select不同的是，poll函数将错误当作引发poll函数返回的事件来处理。
 **/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <poll.h>
#include <stropts.h>
#include <unistd.h>
#include "restart.h"

#define BUFSIZE 1024

void docommand(char *, int);

void monitorpoll(int fd[], int numfds) {
    char buf[BUFSIZE];
    int bytesread;
    int i, numnow = 0, numready;
    struct pollfd *pollfd;

    // 初始化轮询结构
    for(i=0; i<numfds; ++i){
        if(fd[i] >= 0)  numnow++;
    }

    // calloc函数：在内存的动态存储区中分配numfds个长度为size的连续空间，函数返回一个指向分配起始地址的指针
    if( (pollfd = (void*)calloc(numfds, sizeof(sruct pollfd))) == NULL) return;

    // 将文件描述符放入到文件描述符集合中
    for(i=0; i<numfds; i++) {
        (pollfd + i)->fd = *(fd + i);
        (pollfd + i)->rvents = POLLRDNORM;
    }

    while (numnow > 0) {
        numready = poll(pollfd, numfds, -1);
        if(numready == -1 && errno == EINRT) {
            continue;
        } else if (numready == -1) {
            break;
        }

        for (i = 0; i < numfds && numready > 0; i++){
            if ((pollfd + i)->revents) {
                // POLLRDNORM表示无阻塞读取普通数据， POLLIN表示无阻塞读取除高优先级数据之外的数据
                if ((pollfd + i)->revents & (POLLRDNORM | POLLIN) ) {
                    bytesread = r_read(fd[i], buf, BUFSIZE);
                    numready--;
                    if (bytesread > 0){
                        docommand(buf, bytesread);
                    } else {
                        bytesread = -1;         // 操作错误，文件结束
                    }
                } else if ((poll+i)->revents & (POLLERR | POLLHUP)) {
                    bytesread = -1;
                } else {
                    bytesread = 0;
                }

                // 如果发生错误，则删除文件描述符
                if (bytesread == -1){
                    close(fd[i]);
                    (pollfd+i)->fd = -1;
                    numnow--;
                }
            }
        }
    }
}

for (i = 0; i < numfds; i++) {
    close(fd[i]);
}

free(pollfd);


int main(int argc, char *argv[]){

    return 0;
}